package com.spider.page;

import com.spider.pool.UriQueueScheduler;
import com.spider.strategy.ResponseStrategy;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpRequestBase;

import java.util.HashMap;
import java.util.Map;

/**
 * @author β世界
 * Created on 9:12
 * @Description 处理页面工厂
 */
public class PageFactory {
    private final static String[] DEFAULT_PAGE = {
            "com.spider.strategy.HtmlResponseStrategy",
            "com.spider.strategy.JsonResponseStrategy"
    };

    /** 响应策越的Map **/
    private final Map<String, ResponseStrategy> strategyMap = new HashMap<>();
    /** Uri链接管理池 **/
    private final UriQueueScheduler uriQueueScheduler;

    /**
     * 先添加用户自定义的策越实现，每个响应类型对应一个处理策略
     * 初始化一个page创建工厂，先扫描Strategy包下的所有内容，实例化所有的类
     * @author β世界 on 10:29 2021/5/10
     * @param uriQueueScheduler: Uri链接池
     **/
    public PageFactory(UriQueueScheduler uriQueueScheduler,ResponseStrategy[] responseStrategies){
        // 添加用户自定义的响应处理（优先添加）
        for (ResponseStrategy responseStrategy : responseStrategies){
            for (String contentType : responseStrategy.getHandlerContentType()) {
                strategyMap.put(contentType,responseStrategy);
            }
        }
        // 添加完用户自定义，再添加系统默认的，如果存在相关的key了，就不添加
        for (String className : DEFAULT_PAGE) {
            try {
                // 实例化这个类
                ResponseStrategy responseStrategy = (ResponseStrategy) Class.forName(className).newInstance();
                // 查看处理策略是否已经存在
                for (String contentType : responseStrategy.getHandlerContentType()) {
                    if(!strategyMap.containsKey(contentType)){
                        // 不存在就添加
                        strategyMap.put(contentType,responseStrategy);
                    }
                }
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        // 初始化连接池
        this.uriQueueScheduler = uriQueueScheduler;
    }

    /**
     * 根据响应内容获取到相关的创建策越，来让具体的实现策略来创建page对象
     * @author β世界 on 9:59 2021/5/10
     * @param response: 响应内容
     * @param httpRequestBase: 请求实体
     * @return com.spider.page.ResultPage
     **/
    public ResultPage createPage(CloseableHttpResponse response, HttpRequestBase httpRequestBase){
        ResultPage page = null;
        // 遍历策越组，如果包含对应的响应情况就进行处理
        for (String key : strategyMap.keySet()) {
            if(response.getEntity().getContentType().getValue().contains(key)){
                page = strategyMap.get(key).create(response,httpRequestBase,uriQueueScheduler);
            }
        }
        // 如果遍历结束还是空，就默认使用HTML来处理
        if(page == null){
            page = new HtmlPage(response,httpRequestBase,uriQueueScheduler);
        }
        return page;
    }

}
